package com.itheima.health.mobile.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import com.itheima.health.common.MessageConst;
import com.itheima.health.entity.Result;
import com.itheima.health.pojo.Setmeal;
import com.itheima.health.service.SetMealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.List;

@RestController
@RequestMapping("/mobile/setmeal")
@Slf4j
public class SetMealController {

    @Autowired
    private JedisPool jedisPool;

    @Reference
    private SetMealService setMealService;

    /**
     * 查询套餐
     *
     * @return
     */
    @GetMapping("/getSetmeal")
    public Result getSetmeal() {
        if (this.isUsed()) {
            Jedis jedis = jedisPool.getResource();
            String values = jedis.get(MessageConst.GET_SETMEAL_LIST);
            //判断是否为空
            if (values == null) {
                // 无可用列表
                log.debug("redis中，无套餐列表，获取套餐列表放入redis");
                //第一次为空的话   调用service dao  查询数据库
                //rpc调用查询所有套餐
                List<Setmeal> setmealList = setMealService.findAll();

                //放入redis中并设置生存时间  把list转换成字符串  JSON.toJSONString
                jedis.set(MessageConst.GET_SETMEAL_LIST, JSON.toJSONString(setmealList));
                jedis.expire(MessageConst.GET_SETMEAL_LIST, 60 * 5);
                jedis.close();
                return new Result(true, MessageConst.GET_SETMEAL_LIST_SUCCESS, setmealList);
            } else {
                //不为空   调用redis    parse  参数string  返回object
                log.debug("redis中，有套餐列表，JSON字符串变为JSON对象，返回客户端");
                String s = jedis.get(MessageConst.GET_SETMEAL_LIST);

                Object setmealList = JSON.parse(s);
                jedis.close();
                return new Result(true, MessageConst.GET_SETMEAL_LIST_SUCCESS, setmealList);
            }
        } else {
            //rpc调用查询所有套餐
            List<Setmeal> setmealList = setMealService.findAll();
            return new Result(true, MessageConst.GET_SETMEAL_LIST_SUCCESS, setmealList);
        }

    }

    @GetMapping("/findById")
    public Result findById(Integer id) {
        if (this.isUsed()) {
            Jedis jedis = jedisPool.getResource();
            String values = jedis.get(MessageConst.GET_SETMEAL_CONTENT+id);
            //判断是否为空
            if (values == null) {
                // 无可用列表
                log.debug("redis中，无套餐详情，获取套餐详情放入redis");
                //第一次为空的话   调用service dao  查询数据库
                //rpc调用查询数据
                Setmeal setmeal = setMealService.findById(id);

                //放入redis中并设置生存时间  把pojo转换成字符串  JSON.toJSONString
                jedis.set(MessageConst.GET_SETMEAL_CONTENT+id, JSON.toJSONString(setmeal));
                jedis.expire(MessageConst.GET_SETMEAL_CONTENT+id, 60 * 5);
                jedis.close();
                return new Result(true, MessageConst.QUERY_SETMEAL_SUCCESS, setmeal);
            } else {
                //不为空   调用redis    parse  参数string  返回object
                log.debug("redis中，有套餐详情，JSON字符串变为JSON对象，返回客户端");
                String s = jedis.get(MessageConst.GET_SETMEAL_CONTENT+id);

                Object setmeal = JSON.parse(s);
                jedis.close();
                return new Result(true, MessageConst.QUERY_SETMEAL_SUCCESS, setmeal);
            }
        } else {
            //rpc调用查询数据
            Setmeal setmeal = setMealService.findById(id);
            //返回
            return new Result(true, MessageConst.QUERY_SETMEAL_SUCCESS, setmeal);
        }
    }


    public boolean isUsed() {
        try {
            if (jedisPool == null) {
                return false;
            }
            Jedis jedis = jedisPool.getResource();
            if (jedis == null) {
                return false;
            }
            jedis.close();
            return true;
        } catch (Exception e) {
            log.debug("", e);
            return false;
        }
    }
}
